package com.syedu.day16.homework;

import java.io.*;

/**
 * description：
 * @author Administrator
 * @date 2022/4/6 10:49
 *
 * 探索使用第三方工具
 *  hutool: 文件工具类-FileUtil
 *  commons-io: FileUtils
 */
public class MyFileUtil {
    public static void main(String[] args) {
        //listFolder("C:\\Program Files\\Java\\jdk-17.0.1");

        //copyFolder("D:\\每日作业", "D:\\temp\\作业");

        deleteFileAndFolder("D:\\temp");
    }

    /**
     * 写一个方法,可以删除任意文件或者文件夹
     */
    public static void deleteFileAndFolder(String path) {
        //FileUtil.del(new File(path));

        /*try {
            FileUtils.forceDelete(new File(path));
        } catch (IOException e) {
            e.printStackTrace();
        }*/

        File file = new File(path);
        if (file.exists()) {
            if (file.isFile()) {
                file.delete();
            } else {
                for (File f : file.listFiles()) {
                    deleteFileAndFolder(f.getAbsolutePath());
                }
            }
            file.delete();
        } else {
            System.out.println("目标文件或者文件夹不存在...");
        }
    }

    /**
     * 剪切文件或者文件夹 == 复制 + 删除
     */
    public static void cutFileOrFolder(String src, String target) {
        //TODO...
    }

    /**
     * 写一个方法,可以罗列指定文件夹下所有的文件和文件夹,包括深层结构中的
     */
    public static void listFolder(String path) {
        File file = new File(path);
        if (file.exists() && file.isDirectory()) {
            File[] files = file.listFiles();
            for (File f : files) {
                if (f.isFile()) {
                    System.out.println(f.getAbsolutePath());
                } else {
                    listFolder(f.getAbsolutePath());
                }
            }
        } else {
            System.out.println("目标文件夹不存在...");
        }
    }

    /**
     写一个方法,拷贝文件夹
     */
    public static void copyFolder(String src, String target) {
        //1.hutool - FileUtil
        //FileUtil.copy(src, target, true);

        //2.commons-io: FileUtils
        /*try {
            FileUtils.copyDirectory(new File(src),new File(target));
        } catch (IOException e) {
            e.printStackTrace();
        }*/

        //3.自己实现
        File srcFile = new File(src);
        File targetFile = new File(target);
        if (srcFile.exists() && !targetFile.exists()) {
            targetFile.mkdirs();
        }
        for (File f : srcFile.listFiles()) {
            if (f.isFile()) {
                try (BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(f.getAbsolutePath()));
                     BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(target + File.separator + f.getName()))) {
                    int len = -1;
                    //定义缓冲大小
                    byte[] buf = new byte[3 * 1024];//3k
                    //读取一个缓冲大小的数据
                    while ((len = inputStream.read(buf)) != -1) {
                        outputStream.write(buf, 0, len);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                copyFolder(f.getAbsolutePath(), target + File.separator + f.getName());
            }
        }
    }
}